<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>16、Generator函数的语法——Generator.prototype.return()</title>
	</head>
	<body>
		<script type="text/javascript">
			//五、Generator.prototype.return()
			//Generator 函数返回的遍历器对象，还有一个return方法，可以返回给定的值，并且终结遍历 Generator 函数。
			function* gen(){
				yield 1;
				yield 2;
				yield 3;
			}
			var g = gen();
			console.log(g.next())  //Object {value: 1, done: false}
			console.log(g.return('foo'))  //Object {value: "foo", done: true}
			console.log(g.next())  //Object {value: undefined, done: true}
			//上面代码中，遍历器对象g调用return方法后，返回值的value属性就是return方法的参数foo。并且，Generator 函数的遍历就终止了，返回值的done属性为true，以后再调用next方法，done属性总是返回true。
			//如果return方法调用时，不提供参数，则返回值的value属性为undefined。
			function* gen_1(){
				yield 1;
				yield 2;
				yield 3;
			}
			var g_1 = gen_1();
			console.log(g_1.next())  //Object {value: 1, done: false}
			console.log(g_1.return()) //Object {value: undefined, done: true}
			//如果 Generator 函数内部有try...finally代码块，那么return方法会推迟到finally代码块执行完再执行。
			function* numbers(){
				yield 1;
				try{
					yield 2;
					yield 3;
				}finally{
					yield 4;
					yield 5;
				}
				yield 6;
			}
			var g_2 = numbers();
			console.log(g_2.next())  //Object {value: 1, done: false}
			console.log(g_2.next())  //Object {value: 2, done: false}
			console.log(g_2.next())  //Object {value: 3, done: false}
			console.log(g_2.return(7)) //Object {value: 4, done: false}
			console.log(g_2.next())  //Object {value: 5, done: false}
			console.log(g_2.next())  //Object {value: 7, done: true}
			//上面代码中，调用return方法后，就开始执行finally代码块，然后等到finally代码块执行完，再执行return方法。
		</script>
	</body>
</html>
